// 小程序跨页面通信: 发布／订阅模式
// 三个基础方法：on（订阅）、 emit（发布）、 off（注销）
// var app = getApp()
// 订阅：app.event.on('afterPaySuccess', this.afterPaySuccess, this)
// 发布：app.event.emit('afterPaySuccess', orderId)
// 注销：注销之前订阅的事件
// >>> app.event.off() --- 注销所有事件
// >>> app.event.off('afterPaySuccess') --- 注销 afterPaySuccess 事件
// >>> app.event.off('afterPaySuccess', this.afterPaySuccess) --- 注销具体的 afterPaySuccess 事件


class Event {

  on(event, fn, ctx) {
    if (typeof fn != "function") {
      console.error('fn must be a function')
      return
    }

    this._stores = this._stores || {}

    ;
    (this._stores[event] = this._stores[event] || []).push({
      cb: fn,
      ctx: ctx
    })
  }

  emit(event) {
    this._stores = this._stores || {}
    var store = this._stores[event],
      args

    if (store) {
      store = store.slice(0)
      args = [].slice.call(arguments, 1)
      for (var i = 0, len = store.length; i < len; i++) {
        store[i].cb.apply(store[i].ctx, args)
      }
    }
  }

  off(event, fn) {
    this._stores = this._stores || {}

    // all
    if (!arguments.length) {
      this._stores = {}
      return
    }

    // specific event
    var store = this._stores[event]
    if (!store) return

    // remove all handlers
    if (arguments.length === 1) {
      delete this._stores[event]
      return
    }

    // remove specific handler
    var cb
    for (var i = 0, len = store.length; i < len; i++) {
      cb = store[i].cb
      if (cb === fn) {
        store.splice(i, 1)
        break
      }
    }
    return
  }
}

export {
  Event
}